core: Store filenames in sorted order
authorColin Walters <walters@verbum.org>
Mon, 7 Nov 2011 17:26:47 +0000 (12:26 -0500)
committerColin Walters <walters@verbum.org>
Mon, 7 Nov 2011 17:26:47 +0000 (12:26 -0500)
I believe GHashTable order was stable for a given set of names, but
this will make it more explicit, and also allow for binary searching.

libostree/ostree-repo.c

index 3e7f65cd322eeb67b98a281aaee6149ca23dcfbd..703dc881d967f885f4814619a6ce2d089ee5ed88 100644 (file)
@@ -1177,6 +1177,8 @@ import_parsed_tree (OstreeRepo    *self,
   GVariantBuilder files_builder;
   GVariantBuilder dirs_builder;
   GHashTableIter hash_iter;
+  GSList *sorted_filenames = NULL;
+  GSList *iter;
   gpointer key, value;
 
   g_variant_builder_init (&files_builder, G_VARIANT_TYPE ("a(ss)"));
@@ -1187,17 +1189,39 @@ import_parsed_tree (OstreeRepo    *self,
   while (g_hash_table_iter_next (&hash_iter, &key, &value))
     {
       const char *name = key;
-      const char *checksum = value;
+      sorted_filenames = g_slist_prepend (sorted_filenames, (char*)name);
+    }
 
-      g_variant_builder_add (&files_builder, "(ss)", name, checksum);
+  sorted_filenames = g_slist_sort (sorted_filenames, (GCompareFunc)strcmp);
+
+  for (iter = sorted_filenames; iter; iter = iter->next)
+    {
+      const char *name = iter->data;
+      const char *value;
+
+      value = g_hash_table_lookup (tree->files, name);
+      g_variant_builder_add (&files_builder, "(ss)", name, value);
     }
 
+  g_slist_free (sorted_filenames);
+  sorted_filenames = NULL;
+
   g_hash_table_iter_init (&hash_iter, tree->directories);
   while (g_hash_table_iter_next (&hash_iter, &key, &value))
     {
       const char *name = key;
+      sorted_filenames = g_slist_prepend (sorted_filenames, (char*)name);
+    }
+
+  sorted_filenames = g_slist_sort (sorted_filenames, (GCompareFunc)strcmp);
+
+  for (iter = sorted_filenames; iter; iter = iter->next)
+    {
+      const char *name = iter->data;
       GChecksum *dir_checksum = NULL;
-      ParsedDirectoryData *dir = value;
+      ParsedDirectoryData *dir;
+
+      dir = g_hash_table_lookup (tree->directories, name);
 
       if (!import_parsed_tree (self, dir->tree_data, &dir_checksum, error))
         goto out;
@@ -1207,6 +1231,9 @@ import_parsed_tree (OstreeRepo    *self,
       g_checksum_free (dir_checksum);
     }
 
+  g_slist_free (sorted_filenames);
+  sorted_filenames = NULL;
+
   serialized_tree = g_variant_new ("(u@a{sv}@a(ss)@a(sss))",
                                    GUINT32_TO_BE (0),
                                    create_empty_gvariant_dict (),
@@ -1219,6 +1246,7 @@ import_parsed_tree (OstreeRepo    *self,
   
   ret = TRUE;
  out:
+  g_slist_free (sorted_filenames);
   if (builders_initialized)
     {
       g_variant_builder_clear (&files_builder);